/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  const stack = [];
  const pairs = {
    ')': '(',
    ']': '[',
    '}': '{'
  };

  for (let char of s) {
    // 如果是右括号
    if (pairs[char]) {
      // 栈为空或栈顶不匹配则无效
      if (stack.length === 0 || stack.pop() !== pairs[char]) {
        return false;
      }
    } else {
      // 如果是左括号，直接入栈
      stack.push(char);
    }
  }

  // 最终栈为空则有效
  return stack.length === 0;
};